import { Column } from '../type';
import { useScroll } from '@vueuse/core';
import { ref, watch, shallowRef } from 'vue';

export function fixedModule(tableWrapper: HTMLElement | null, columns: Column[]) {
  // 使用 useScroll 自动追踪滚动位置
  const { x: scrollLeft, y: scrollTop } = useScroll(tableWrapper);

  // 使用 shallowRef 来存储缓存的计算结果
  const leftOffsetCache = shallowRef<Record<number, number>>({});
  const rightOffsetCache = shallowRef<Record<number, number>>({});

  // 用于标记缓存是否需要更新
  const cacheVersion = ref(0);

  // 监听 columns 的变化，特别是 width 属性的更新
  watch(
    () => columns.map((col) => ({ width: col.width, fixed: col.fixed, visible: col.visible })),
    () => {
      // 当列发生变化时，增加缓存版本号以标记需要重新计算
      cacheVersion.value++;
      // 清空缓存
      leftOffsetCache.value = {};
      rightOffsetCache.value = {};
    },
    { deep: true }
  );

  // 计算左侧固定列的偏移量（带缓存）
  const calculateLeftFixedOffset = (colIndex: number) => {
    // 检查缓存中是否存在结果
    if (leftOffsetCache.value[colIndex] !== undefined) {
      return leftOffsetCache.value[colIndex];
    }

    let offset = 30; // 序号列宽度
    for (let i = 0; i < colIndex; i++) {
      const column = columns[i];
      if (column.fixed === 'left' && column.visible) {
        offset += column.width || 80;
      }
    }

    // 将结果存入缓存
    leftOffsetCache.value[colIndex] = offset;
    return offset;
  };

  // 计算右侧固定列的偏移量（带缓存）
  const calculateRightFixedOffset = (colIndex: number) => {
    // 检查缓存中是否存在结果
    if (rightOffsetCache.value[colIndex] !== undefined) {
      return rightOffsetCache.value[colIndex];
    }

    let offset = 0;
    for (let i = columns.length - 1; i > colIndex; i--) {
      const column = columns[i];
      if (column.fixed === 'right' && column.visible) {
        offset += column.width || 80;
      }
    }

    // 将结果存入缓存
    rightOffsetCache.value[colIndex] = offset;
    return offset;
  };

  // 优化版本：不使用 Promise 的 getHeaderFixedStyle 函数
  const getHeaderFixedStyle = (column: Column, index: number) => {
    if (column.fixed === 'left') {
      return {
        position: 'sticky',
        left: calculateLeftFixedOffset(index) + 'px',
        zIndex: 15
      };
    } else if (column.fixed === 'right') {
      return {
        position: 'sticky',
        right: calculateRightFixedOffset(index) + 'px',
        zIndex: 15
      };
    }
    return {};
  };

  // 优化版本：不使用 Promise 的 getCellFixedStyle 函数
  const getCellFixedStyle = (column: Column, index: number) => {
    if (column.fixed === 'left') {
      return {
        position: 'sticky',
        left: calculateLeftFixedOffset(index) + 'px',
        zIndex: 12
      };
    } else if (column.fixed === 'right') {
      return {
        position: 'sticky',
        right: calculateRightFixedOffset(index) + 'px',
        zIndex: 12
      };
    }
    return {};
  };

  return {
    // 返回 scrollLeft 和 scrollTop 供外部使用
    scrollLeft,
    scrollTop,
    getHeaderFixedStyle,
    getCellFixedStyle
  };
}
